package controllers;

import java.util.List;

import notifiers.Notificador;

import models.Nutri;
import models.Paciente;
import play.mvc.With;
import controllers.securesocial.SecureSocial;

@With(SecureSocial.class)
public class Nutris extends CustomCRUD {
	
	private static String CONFIRMAR_LINK = "paciente/confirmarPedido/";
	
	public static void buscarPaciente(int page, String search, String searchFields, String orderBy, String order) {
		validation.clear();
		String mail = checkMail();
		
		if ("".equals(mail.trim())) {
			validation.addError("mail", "crud.help.required");
			validation.keep();
			render();
		}
		
		List<Paciente> objects = Paciente.find("byEmail", mail).fetch();
		Long count = new Long(objects.size());
		Long totalCount = new Long(objects.size());
		
		render(objects, count, totalCount, page, orderBy, order);
	}
	
	//TODO: Nico, funcionalidad que me quedaba pendiente... pero es muy repetitivo hay que evaluar si sirve dejarla
	public static void buscarUsuario(int page, String search, String searchFields, String orderBy, String order) {
		
		String mail = checkMail();
		
		List<Paciente> objects = Paciente.find("byEmail", mail).fetch();
		Long count = new Long(objects.size());
		Long totalCount = new Long(objects.size());
		
		render(objects, count, totalCount, page, orderBy, order);
	}
	
	private static String checkMail() {
		String mail = params.get("search");
		if (mail == null) {
			// carga inicial
			render();
		}
		
		return mail;
	}
	
	/**
	 * Actualiza el estado del paciente con respecto al nutricionista y envia el mail de notificacion
	 */
	public static void adquirirPaciente(Long pacienteId) {
	
		//identificar paciente, cambiar estado a pendiente
		Paciente paciente = Paciente.findById(pacienteId);
		Nutri nutri = (Nutri) getUsuarioLogueado();
		nutri.agregarPaciente(paciente);
		
		//TODO: nico -> el setnutri lo hace dentro del metodo agregarPaciente... habria que revisarlo si no funca
		paciente.setNutricionista(nutri);
		nutri.save();
		
		String link = CONFIRMAR_LINK+nutri.getId();
		
		//enviar mail
		Notificador.emailConfirmacion(paciente.getNombre(), paciente.getEmail(), nutri.getNombre(), link);
		
		//retorna al listado de pacientes
		Pacientes.list(0, null, null, null, null);
	}
	
	/**
	 * Desasigna el paciente del nutricionista y ennvia el mail de notificacion
	 */
	public static void desasignarPaciente(Long pacienteId) {
	
		Paciente paciente = Paciente.findById(pacienteId);
		Nutri nutri = (Nutri) getUsuarioLogueado();
		nutri.desasignarPaciente(paciente);
		nutri.save();
		
		// no se porque no se esta acutalizando correctamente cuando lo ponia en el metodo desasignarPaciente por eso lo pongo aca
		paciente.setNutricionista(null);
		paciente.setEstadoPaciente(null);
		paciente.save();
		
		//enviar mail
		Notificador.emailDesasignarPaciente(nutri.getNombre(), nutri.getEmail(), paciente.getNombre(), paciente.getEmail());
		
		//retorna al listado de pacientes
		Pacientes.list(0, null, null, null, null);
	}
	
	public static void enviarInvitacion(String email) {
		
		Nutri nutri = (Nutri) getUsuarioLogueado();
		String link = CONFIRMAR_LINK+nutri.getId();
		
		//nico -> al no existir el user en el sistema no puedo dejarlo en Pendiente... creo que es lo correcto

		//enviar mail
		Notificador.emailInvitacion(email, nutri.getNombre(), link);
				
		//retorna al listado de pacientes
		Pacientes.list(0, null, null, null, null);
	}
	
}
